HMAC (Hash-Based Message Authentication Code)
암호화 랑은 약간 느낌이 다른다. 암호화는 평문을 암호문으로 만든 후 (암호화), 다시 평문으로 만들 때 (복호화) 키가 필요하다. HMAC 은 메시지 + 비밀키(Sealed secret) 을 해싱하여(e.g base64) 고정 길이 서명 문으로 만든다. HMAC 은 메시지가 변조되지 않았음을 증명하기 위해 사용된다. 그리고 암호화랑 달리 복호화가 불가능하다. (이걸 일방향 함수라 하나봄)
| 구분 | 설명 |
|---|---|
| message | 검증하고 싶은 데이터 (userID, event etc) |
| key | 비밀 키 (서버만 알고 있음, sealed secret 으로 보호) |
| HMAC 결과 | 메시지의 ‘디지털 서명’ |
| 복호화 | 불가 (일방향 함수: 암호화만 가능함) |
| 용도 | 데이터 무결성 검증, 위조 방지 |
내가 이벤트를 참여함 (eventID: 1234, userID: 300)
이 두 값을 key 와 함께 암호화해서 HMAC 결과를 낸다. 이걸 검증하고자 하는 곳에 보냄.
다른곳에서 내가 이벤트 참여한걸 검증하기 위해선 세가지 값을 알아야 함.
참여한 eventID, userID, 그리고 key 값. 이 세 가지 값을 가지고 똑같이 HMAC 결과를 낸다.
두 HMAC 서명문을 비교하여 값이 같으면 검증 성공이고, 다르면 위조된 값이라 판단함.
예시
key := "mysecretkey123" message1 := "user_id:100:timestamp:1234567890" message2 := "user_id:100:timestamp:1234567890" // 같은 메시지 message3 := "user_id:999:timestamp:1234567890" // 다른 메시지 // 같은 key + 같은 message = 같은 서명 computeHMAC(key, message1) // → "x8Kj2L5mN9pQ..." computeHMAC(key, message2) // → "x8Kj2L5mN9pQ..." (동일!) // 같은 key + 다른 message = 다른 서명 computeHMAC(key, message3) // → "a1B2c3D4e5F6..." (완전히 다름!) // 다른 key + 같은 message = 다른 서명 computeHMAC("wrongkey", message1) // → "z9Y8x7W6v5U4..." (완전히 다름!)
공격 시나리오:
원본 요청: userId: 100 eventId: lucky_draw checksum: "K7s9D2f4H6j8..." (서버가 생성) 공격자가 변조 시도: userId: 999 ← 변조! eventId: lucky_draw checksum: "K7s9D2f4H6j8..." (그대로 사용) 서버 검증: expectedChecksum = HMAC(key, "999:lucky_draw") → "X1y2Z3a4B5c6..." (다름!) expectedChecksum != receivedChecksum → 🚫 요청 거부!
Checksum과의 관계 (HMAC = 보안 강화된 checksum)
Checksum 이 무엇이냐? 데이터가 전송되는 동안 값이 온전히 보장되는지 확인하기 위한 중복 검사의 형태로, 공간(전자 통신)이나 시간(기억 장치)속에서 송신된 자료의 무결성을 보호하는 단순한 방법이다. check + sum : 초기 체크섬 알고리즘(ex, LRC, BCC) 은 실제로 데이터 바이트를 단순히 더해서(sum) 만들어낸 값이었기 때문에 checksum 이라는 말이 탄생했다.
→ 데이터가 손상되었는지 확인하기 위해 계산한 합(값)
- 파일 전송이나 네트워크 패킷에서 사용
- 단순 데이터 변형 여부만 확인
- 키가 없음 → 누구든 쉽게 위조 가능
즉 checksum 은 단순 오류(전송 중 데이터 잘못 보내는 등)는 잡아내지만 **의도적인 공격(값 변조)**는 막지 못한다.
HMAC = “비밀키가 포함된 보안용 checksum”
HMAC 과 checksum 은 비슷해 보이지만 서로 개념은 다르다.
| 항목 | 일반 checksum | HMAC |
|---|---|---|
| 목적 | 전송 중 오류 감지 | 위조 방지 + 데이터 무결성 검증 |
| 비밀키 사용 | ❌ 없음 | ✔️ 있음 |
| 공격자 위조 가능? | 가능 | 매우 어려움 (비밀키를 모르면 재생 불가) |
| 보안 수준 | 낮음 | 매우 높음 |
checksum 은 단순 무결성 검사, HMAC 은 보안이 강화된 checksum(=서명) 으로 볼 수 있다.
실제로 HMAC 결과를 “checksum” 이라고 부르는 서비스들도 많다. 엄밀한 의미로는 HMAC = 암호학적 메시지 인증 코드(Crypto-MAC) 이고 일반 checksum 보다 훨씬 안전하다.